export const validatePsidno = (value: string) => {
  const psidno = String(value)
  // 1.校验身份证号格式和长度
  const regPsidno = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[X])$)$/
  if (!regPsidno.test(psidno)) {
    return false
  }
  if (psidno.length === 18) {
    // 18位号码 省（2位）市（2位）县（2位）年（4位）月（2位）日（2位）校验码（4位）
    const reg = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/)
    const arrSplit = psidno.match(reg)
    const year = arrSplit[2]
    const month = arrSplit[3]
    const day = arrSplit[4]
    if (!validateBirthday(year, month, day)) {
      return false
    }
  } else {
    return false
  }


  // 校验出生日期是否合理
  function validateBirthday(year, month, day) {
    year = Number(year) // 年
    month = Number(month) // 月
    day = Number(day) // 日
    const nowTime = new Date().getTime() // 当前时间戳
    const birthTime = new Date(`${year}-${month}-${day}`).getTime() // 获取出生日期的时间戳
    // 不能是明天出生的吧
    if (birthTime > nowTime) {
      return false
    }
    // 一般人活不到150岁吧
    const nowYear = new Date().getFullYear()
    if ((nowYear - year) > 150) {
      return false
    }
    // 不能是13月出生的吧
    if (month < 1 || month > 12) {
      return false
    }
    // 不能是2月30号、4月31号、5月32号出生的吧
    const date = new Date(year, month, 0) // 获取当月的最后一天
    if (day < 1 || day > date.getDate()) {
      return false
    }
    return true
  }
  // 4.18位号码校验生成的校验码
  if (psidno.length === 18) {
    const Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] // 加权因子
    const parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] // 校验码
    let sum = 0
    for (let i = 0; i < 17; i++) {
      sum += Number(psidno.charAt(i)) * Wi[i]
    }
    if (parity[sum % 11] !== psidno[17]) {
      return false
    }
  }
  return true
}


export const validatePhone = (value: string) => {
  const phone = String(value)
  const regPhone = /^1[3-9]\d{9}$/
  return regPhone.test(phone)
}


/**
 * 是否合法IP地址
 * @param value
 * @param callback
 */
export const validateIP = (value) => {
  if (value === '' || typeof value === 'undefined' || value == null) {
    return false
  } else {
    const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
    if ((!reg.test(value)) && value !== '') {
      return false
    }
    return true
  }
}

export const validateUname = (value) => {
  if (value === '' || typeof value === 'undefined' || value == null) {
    return false
  } else {
    const reg = /^([\u4E00-\u9FFF]|[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b\uff01\u3010\u3011\uffe5])+$/
    if ((!reg.test(value)) && value !== '') {
      return false
    }
    return true
  }
}

export const validateIdpolice = (value) => {
  if (value === '' || typeof value === 'undefined' || value == null) {
    return false
  } else {
    const reg = /^\d{6}$/
    if ((!reg.test(value)) && value !== '') {
      return false
    }
    return true
  }
}

export const checkIdpolice = (rule, value, callback) => {
  if (!validateIdpolice(value)) {
    return callback(new Error('输入警号不正确'))
  }
  return callback()
}

export const checkUid = (rule, value, callback) => {
  if (!validatePsidno(value)) {
    return callback(new Error('输入身份证号不正确'))
  }
  return callback()
}

export const checkUname = (rule, value, callback) => {
  if (!validateUname(value)) {
    return callback(new Error('输入姓名不正确'))
  }
  return callback()
}


export const checkPasswd = (rule, value, callback) => {
  // 以字母开头
  const regex = /^[A-Za-z][A-Za-z\d!@#$%^&*.]*$/;
  const hasCharcase = /[A-Za-z]/.test(value);
  const hasNumber = /\d/.test(value);
  const hasSpecialChar = /[!@#$%^&*.]/.test(value);

  // 统计包含的字符类型数量
  const typeCount = [hasCharcase, hasNumber, hasSpecialChar].filter(Boolean).length;

  // if (!regex.test(value)) {
  //   return callback(new Error('密码必须以字母开头'));
  // }
  if (value.length < 9) {
    return callback(new Error('密码长度必须至少9位'));
  }
  if (typeCount < 3) {
    return callback(new Error('密码必须包含字母、数字、特殊字符'));
  }

  return callback();
};


export const checkPasswd2 = (rule, passwd, passwd2, callback) => {
  // 以字母开头
  const regex = /^[A-Za-z][A-Za-z\d!@#$%^&*.]*$/;
  const hasUppercase = /[A-Z]/.test(passwd2);
  const hasLowercase = /[a-z]/.test(passwd2);
  const hasNumber = /\d/.test(passwd2);
  const hasSpecialChar = /[!@#$%^&*.]/.test(passwd2);

  // 统计包含的字符类型数量
  const typeCount = [hasUppercase, hasLowercase, hasNumber, hasSpecialChar].filter(Boolean).length;

  // if (!regex.test(passwd2)) {
  //   return callback(new Error('密码必须以字母开头'));
  // }
  if (passwd2.length < 9) {
    return callback(new Error('密码长度必须至少9位'));
  }
  if (typeCount < 3) {
    return callback(new Error('密码必须包含字母、数字、特殊字符'));
  }

  if (passwd2 != passwd) {
    return callback(new Error('密码不一致'));
  }
  return callback();
};
